package com.zx.JDK特性.jdk1_8;

import com.zx.common.entity.User;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
import org.junit.Test;

/**
 * Lambda表达式的
 * 方法引用： 若Lambda体中的内容有方法已经实现了，我们可以使用“方法引用”（可以理解为方法引用是Lambda表达式的另外一种表现形式）
 * 主要的语法如下：
 * 对象::实例方法名
 * 类::实例方法名
 * 类::静态方法名
 * ①Lambda体中调用方法的参数列表与返回值类型，要与函数式接口中抽象方法的函数列表和返回值类型一致。
 * ②若Lambda参数列表中的第一参数是实例方法的调用者，而第二个参数是实例方法的参数时，可以使用ClassName：：method进行调用
 */
public class Lambda2 {

    List<User> list = Arrays.asList(
            new User(2L, "AAA", 20),
            new User(4L, "BBB", 40),
            new User(4L, "CCC", 40),
            new User(5L, "DDD", 50),
            new User(3L, "EEE", 30),
            new User(1L, "FFF", 10)
    );

    /**
     * 调用构造函数，创建对象
     */
    @Test
    public static void test01() {
        final Supplier<User> fun = User::new;//调用无参构造函数
        final User user = fun.get();
        System.out.println(user);

        final Function<String, User> fun1 = User::new;//调用一个String类型的参数构造函数
        final User user2 = fun1.apply("张三");
        System.out.println(user2);

    }

    /**
     * 对象::实例方法名
     */
    @Test
    public static void test03() {
        final Function<String, User> fun = User::new;//调用一个String类型的参数构造函数
        final User user = fun.apply("张三");
        final Supplier<String> s = user::getName;
        System.out.println(s.get());
    }

    /**
     * 调用构造函数，创建数组
     */
    @Test
    public void test02() {
        // Integer 为数组长度
        final Function<Integer, String[]> fun = String[]::new;//调用无参构造函数
        final String[] apply = fun.apply(10);
        System.out.println(Arrays.toString(apply));
    }

    /**
     * 类::实例方法名
     */
    @Test
    public void test04() {
        // 普通lambda
        this.list.forEach(u -> System.out.println(u.getName()));
        // 使用方法引用的lambda
        this.list.forEach(User::getName);
    }

    /**
     * 类::静态方法名
     */
    @Test
    public void test05() {
        this.list.stream()
                .map(User::getName)
                .map(String::toLowerCase)//调用静态方法
                .forEach(System.out::println);
    }


}
